home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
9-Digit Zip Code Directory
/
9-Digit Zip Code Directory (American Business Information) (ABIZIP-12).ISO
/
z4src.zip
/
Z4INQ.CPP
< prev
next >
Wrap
C/C++ Source or Header
|
1995-09-20
|
13KB
|
493 lines
//----------------------------------------------------------------------------
// MODULE DESCRIPTION
//
// Module: z4inq.cpp
// Title: ZIP+4 Engine
// Notice: John M. Weeder
// Copyright (c) 1993. All rights reserved.
// This module contains proprietary information and should be
// treated as confidential.
//
//----------------------------------------------------------------------------
// MAINTENANCE HISTORY
//
// $Workfile$
// $Revision$
// $Author$
// $Date$
// $Log$
//
//----------------------------------------------------------------------------
// MODULE NARRATIVE
//
// This module contains code for the class Z4_INQ.
//
// The code in this module may be written in C++ or C.
//
// This module is portable to:
// DOS 3.X+
// MS Windows 3.X+
// OS/2 2.X+
// OS/2 2.0 PM
//
// The following compilers are supported:
// MSC 6.0A
// MSC/C++ 7.0
// Borland C++ 3.1 for DOS
// Borland C++ 1.0 for OS/2 2.X
//
//----------------------------------------------------------------------------
#include <z4.h>
//----------------------------------------------------------------------------
// Globals
//----------------------------------------------------------------------------
BOOL Z4_INQ::fInit = FALSE;
Z4_AB_FILE Z4_INQ::ab_file;
Z4_CS_FILE Z4_INQ::cs_file;
Z4_CX_FILE Z4_INQ::cx_file;
Z4_ST_FILE Z4_INQ::st_file;
Z4_Z4_FILE Z4_INQ::z4_file;
Z4_Z5_FILE Z4_INQ::z5_file;
Z4_ZX_FILE Z4_INQ::zx_file;
Z4_CS Z4_INQ::cs;
Z4_CX Z4_INQ::cx;
Z4_Z4 Z4_INQ::z4;
Z4_Z5 Z4_INQ::z5;
Z4_ZX Z4_INQ::zx;
//----------------------------------------------------------------------------
// Description: Default constructor
// Parameters:
// Returns:
//----------------------------------------------------------------------------
FN_M Z4_INQ::Z4_INQ()
{
Z4_INQ::Initialize(CL_INIT_CLASS);
}
//----------------------------------------------------------------------------
// Description: Copy constructor
// Parameters: rcz4_inq Reference to object to copy.
// Returns:
//----------------------------------------------------------------------------
FN_M Z4_INQ::Z4_INQ(RCZ4_INQ rcz4_inq)
{
Z4_INQ::Initialize(CL_INIT_CLASS);
*this = rcz4_inq;
}
//----------------------------------------------------------------------------
// Description: Destructor
// Parameters:
// Returns:
//----------------------------------------------------------------------------
FN_M Z4_INQ::~Z4_INQ()
{
Z4_INQ::Destroy(FALSE);
}
//----------------------------------------------------------------------------
// Description:
// Parameters:
// Returns: TRUE if successful.
//----------------------------------------------------------------------------
VOID FN_M Z4_INQ::Clear()
{
request = Z4_RQ_DFT;
result = Z4_RESULT_FAILURE;
fInvZip4 = FALSE;
fInvZip5 = FALSE;
fInvCity = FALSE;
fInvState = FALSE;
fZip5Changed = FALSE;
fCSChanged = FALSE;
fAddrChanged = FALSE;
fFacilityOther = FALSE;
fNonDeliverable = FALSE;
fBetterAvailable = FALSE;
fNoPrimary = FALSE;
fSecAvail = FALSE;
fInvSec = FALSE;
fStackOverFlow = FALSE;
szAddr1[0] = '\0';
szAddr2[0] = '\0';
szCity[0] = '\0';
szState[0] = '\0';
szZip[0] = '\0';
match.Clear();
parse.Clear();
std.Clear();
cSelect = 0;
return ;
}
//----------------------------------------------------------------------------
// Description:
// Parameters:
// Returns: TRUE if successful.
//----------------------------------------------------------------------------
BOOL FN_M Z4_INQ::Close()
{
ab_file.Destroy();
cs_file.Destroy();
cx_file.Destroy();
st_file.Destroy();
z4_file.Destroy();
z5_file.Destroy();
zx_file.Destroy();
return TRUE;
}
//----------------------------------------------------------------------------
// Description: Destroy object. Free any resources used by object.
// Normally called by destructor.
// Should allow multiple calls from various classes.
// A class should almost always re-init its variables when
// it is destroyed to prevent accidents.
// Parameters: fDestroyAll Destroy parents also?
// Default is TRUE.
// Returns: TRUE if successful.
//----------------------------------------------------------------------------
BOOL FN_M Z4_INQ::Destroy(BOOL fDestroyAll)
{
Z4_INQ::Initialize(CL_INIT_CLASS_VARS);
if (fDestroyAll) // Destroy parent.
Z4_INQ_PARENT::Destroy(fDestroyAll);
return TRUE;
}
//----------------------------------------------------------------------------
// Description:
// Parameters:
// Returns: TRUE if successful.
//----------------------------------------------------------------------------
VOID FN_M Z4_INQ::Flags()
{
fStackOverFlow = match.fStackOverFlow;
fBetterAvailable = match.fBetterAvailable;
fInvZip4 = match.fInvZip4;
fInvZip5 = match.fInvZip5;
fInvCity = match.fInvCity;
fNoPrimary = match.fNoPrimary;
fSecAvail = match.fSecAvail;
fInvSec = match.fInvSec;
fInvState = parse.fInvState;
fFacilityOther = std.fFacilityOther;
fNonDeliverable = std.fNonDeliverable;
fAddrChanged = stricmp(szAddr1, std.szAddr1) != 0 || stricmp(szAddr2, std.szAddr2) != 0;
fCSChanged = stricmp(parse.szCity, std.szCity) != 0 || parse.state != std.state;
fZip5Changed = stricmp(parse.szZip5, std.szZip5) != 0;
return ;
}
//----------------------------------------------------------------------------
// Description: Initialize object.
// Normally called by constructor.
// Should allow multiple calls from various classes.
// Parameters: sInit Initialization code. May be one of the following:
// CL_INIT_CLASS Reset class variables and
// and dynamic allocations for
// this class only.
// CL_INIT_CLASS_VARS Reset class variables for
// this class only.
// CL_INIT_VARS Reset class variables for
// this class only.
// CL_INIT_ALL Initialize class and all
// parent class, including
// dynamic memory allocation.
// Default is CL_INIT_ALL
// Returns: TRUE if successful.
//----------------------------------------------------------------------------
BOOL FN_M Z4_INQ::Initialize(SHORT sInit)
{
if (sInit == CL_INIT_VARS || sInit == CL_INIT_ALL)
Z4_INQ_PARENT::Initialize(sInit);
pfnzip4 = NULL;
return TRUE;
}
//----------------------------------------------------------------------------
// Description:
// Parameters:
// Returns: TRUE if successful.
//----------------------------------------------------------------------------
BOOL FN_M Z4_INQ::Inquiry(Z4_RQ _request)
{
request = _request;
result = Z4_RESULT_FAILURE;
match.pfnzip4 = pfnzip4; // Propagate call back function!
strtrim(szAddr1);
strtrim(szAddr2);
strtrim(szCity);
strtrim(szState);
strtrim(szZip);
if (pfnzip4 != NULL && !pfnzip4())
{
result = Z4_RESULT_ABORT;
goto EXIT_FUNC;
}
parse.Clear();
if (!parse.LastLine(szZip, szCity, szState))
goto EXIT_FUNC;
if (request == Z4_RQ_DFT)
{
if (szAddr1[0] || szAddr2[0])
request = Z4_RQ_Z4;
else if (parse.szZip4[0])
request = Z4_RQ_ZX;
else if (parse.szZip5[0])
request = Z4_RQ_Z5;
else if (parse.szCity[0])
request = Z4_RQ_CS;
else
{
result = Z4_RESULT_INV_CSZ;
if (pfnzip4 != NULL)
pfnzip4(1);
goto EXIT_FUNC;
}
}
switch (request)
{
case Z4_RQ_CS:
result = match.CS(parse);
break;
case Z4_RQ_Z5:
result = match.Z5(parse);
break;
case Z4_RQ_Z4:
if (!parse.Primary(szAddr2)
|| !parse.Secondary(szAddr1))
break;
result = match.Z4(parse);
break;
case Z4_RQ_ZX:
result = match.ZX(parse);
break;
default:
break;
}
if (result != Z4_RESULT_SUCCESS
&& result != Z4_RESULT_EXACT
&& result != Z4_RESULT_MULTI)
{
match.cRecords = 0;
}
cSelect = 0;
if (match.cRecords && result != Z4_RESULT_FAILURE)
Select(cSelect);
EXIT_FUNC:
if (pfnzip4 != NULL)
pfnzip4(1);
return TRUE;
}
//----------------------------------------------------------------------------
// Description:
// Parameters:
// Returns: TRUE if successful.
//----------------------------------------------------------------------------
BOOL FN_M Z4_INQ::Open(FLAG16 fs)
{
if (fs & Z4_INQ_AB)
{
Z4_INQ::ab_file.ClearError();
if (!Z4_INQ::ab_file.Open())
return FALSE;
}
if (fs & Z4_INQ_CX)
{
Z4_INQ::cx_file.ClearError();
if (!Z4_INQ::cx_file.Open())
return FALSE;
}
if (fs & Z4_INQ_CS)
{
Z4_INQ::cs_file.ClearError();
if (!Z4_INQ::cs_file.Open())
return FALSE;
}
if (fs & Z4_INQ_ST)
{
Z4_INQ::st_file.ClearError();
if (!Z4_INQ::st_file.Open())
return FALSE;
}
if (fs & Z4_INQ_Z4)
{
Z4_INQ::z4_file.ClearError();
if (!Z4_INQ::z4_file.Open())
return FALSE;
}
if (fs & Z4_INQ_Z5)
{
Z4_INQ::z5_file.ClearError();
if (!Z4_INQ::z5_file.Open())
return FALSE;
}
if (fs & Z4_INQ_ZX)
{
Z4_INQ::zx_file.ClearError();
if (!Z4_INQ::zx_file.Open())
return FALSE;
}
return TRUE;
}
//----------------------------------------------------------------------------
// Description:
// Parameters:
// Returns: TRUE if successful.
//----------------------------------------------------------------------------
BOOL FN_M Z4_INQ::Select(SIZET _cSelect)
{
cSelect = MIN(match.cRecords, _cSelect);
std.Clear();
switch (request)
{
case Z4_RQ_CS:
{
CHAR szZip5[MAX_ZIP5+1];
szZip5[MAX_ZIP5] = '\0';
strb2a(cx.abZip5[cSelect], MAX_ZIP5_BCD, szZip5, MAX_ZIP5, TRUE);
if (!std.CS(cx, szZip5))
{
result = Z4_RESULT_FAILURE;
return FALSE;
}
break;
}
case Z4_RQ_Z4:
if (!std.Z4(match.arecid[cSelect], parse))
{
result = Z4_RESULT_FAILURE;
return FALSE;
}
break;
case Z4_RQ_Z5:
if (!std.Z5(match.arecid[cSelect], parse.szZip5))
{
result = Z4_RESULT_FAILURE;
return FALSE;
}
break;
case Z4_RQ_ZX:
if (!std.ZX(match.arecid[cSelect], parse.szAddon))
{
result = Z4_RESULT_FAILURE;
return FALSE;
}
break;
default:
result = Z4_RESULT_FAILURE;
return FALSE;
}
Flags();
return TRUE;
}
//----------------------------------------------------------------------------
// Description:
// Parameters:
// Returns: TRUE if successful.
//----------------------------------------------------------------------------
BOOL FN_M Z4_INQ::Set(PCSZ pcszCity, PCSZ pcszState, PCSZ pcszZip, PCSZ pcszAddr1, PCSZ pcszAddr2)
{
Clear();
strtrim(strcpy(szAddr1, (pcszAddr1 ? pcszAddr1: "")));
strtrim(strcpy(szAddr2, (pcszAddr2 ? pcszAddr2: "")));
strtrim(strcpy(szCity, (pcszCity ? pcszCity: "")));
strtrim(strcpy(szState, (pcszState ? pcszState: "")));
strtrim(strcpy(szZip, (pcszZip ? pcszZip: "")));
return TRUE;
}
//----------------------------------------------------------------------------
// Description: Initialize engine
// Parameters:
// Returns: TRUE if successful.
//----------------------------------------------------------------------------
BOOL FN_E Z4_INQ::Start(FLAG16 fs)
{
BOOL fWrite = BTEST(fs, Z4_INQ_WRITE);
BOOL fReinit = BTEST(fs, Z4_INQ_REINIT);
if (fInit) // Only re-init if forced
{
if (fReinit) // If re-initing, terminate first
Terminate();
else
return TRUE;
}
CL_PARM cl_parm; // Get data path from configuration file
cl_parm.SetName("DATA");
cl_parm.Get();
PCSZ pcsz = (PCSZ)cl_parm;
if (pcsz == NULL || !pcsz[0]) // If none found, check environment
pcsz = EnvGet("DATA");
DioSetDataPath(pcsz); // Set data path
fInit = TRUE; // Open files
if (!DioOpenAllPhysical(CfgGet(CFG_PROGRAM_ID), fWrite)
|| !Z4_INQ::Open(fs)) {
return FALSE; }
DioRelease(); // Release directory and header caches!
return TRUE;
}
//----------------------------------------------------------------------------
// Description: Terminate engine
// Parameters:
// Returns: TRUE if successful.
//----------------------------------------------------------------------------
BOOL FN_E Z4_INQ::Terminate()
{
if (!fInit)
return TRUE;
fInit = FALSE;
Z4_INQ::Close(); // Close data files
DioCloseAll(); // Close physical files
return TRUE;
}
//----------------------------------------------------------------------------
//------------------------------- End of File --------------------------------
//----------------------------------------------------------------------------